#  Базовое описание сущности "Contexts"
entities:
  components:
    title: Компоненты
    config:
      root_menu: Архитектура  # Корневое меню представления компонентов
    description: >
      Архитектурные компоненты.
    schema:
      type: object
      patternProperties:
        "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-zA-Z0-9][a-zA-Z0-9_-]*)*$":
          type: object
          properties:
            title:
              title: Название компонента
              type: string
            entity:
              title: Представление компонента
              type: string
          required:
            - title
            - entity
      additionalProperties: false
    # Определяет пути к объектам сущности
    objects:
      component: 
        route: "/"              # Путь к объектам компонента
        title: Арх. компонент   # Название объекта 
        # JSONata генератор символа в svg для представления в диаграммах. 
        #  $params.subject - передается объект рендеринга. Может быть не определен. В этом случае, необходимо вернуть неспецифичный (общий) символ объекта.
        #  $               - Data Lake архитектуры. Может быть не определен, если Data Lake недоступен.
        symbol: >     
          (
            /* Обрабатываем входящие параметры */
            $manifest := $;
            $component := $params.subject.$spread()[0].*;
            $defConfig := $manifest.entities.contexts.config;
          
            /* Высота строки аспекта */
            $rowHeight := 14;
            /* Отступы */
            $padding := 8;
            /* Отступы */
            $headerOffset := 12;
            /* Ширину символа */
            $fontWidth := 7;
            /* Высота символа */
            $fontHeight := 12;

            /* Определяем заголовок */
            $header := $component.title;
          
            /* Определяем количество аспектов для вычисления высоты символа */
            $aspectCount := $count($component.aspects);
          
            /* Формируем массив аспектов */
            $aspects := $component.aspects.(
              $aspect := $lookup($manifest.aspects, $);
              {
                "id" : $,
                "title": $aspect.title ? $aspect.title : $ 
              }
            );
          
            /* Определяем максимальную длину текста для вычисления ширины символа */
            $maxTitle := $max([$max($aspects.($length(title))), $length($header)]);
          
            /* Вычисляем размеры символа */
            $width := $maxTitle ? $maxTitle * $fontWidth + $padding * 2 : 64; /* Умножаем на ширину символа */   
            $height := ($aspectCount + 1) * $rowHeight + $padding * 2 + $headerOffset; /* Умножаем на высоту строки */
          
            /* Генерируем символ */
            '<svg fill="#000000" width="' & $width & 'px" height="' & $height & 'px" viewBox="0 0 ' & $width & ' ' & $height & '" version="1.1" xmlns="http://www.w3.org/2000/svg">' 
                  & '<g>'
                      /* Создаем контейнер */
                      & '<rect width="' & $width & 'px" height="' & $height & 'px" fill=\"#eee\" stroke=\"#222\" rx="3" />'
                      /* Создаем заголовок */
                      & '<text x="50%" y="12" style="font-size:' & $fontHeight & '" fill="green" text-anchor="middle" dominant-baseline="middle" >' & $header & '</text>'
                      /* Заполняем аспектами */
                      & $join($map($aspects, function($v, $i) {(
                          '<a href=\"/architect/aspects/' & $v.id & '\" >'
                          & '<text x="6" y="' & ($i * $rowHeight + $padding + $rowHeight + $headerOffset) & '" style="font-size:' & $fontHeight & '" fill="blue">' & $v.title & '</text>'
                          & '</a>'
                      )}))
                  & '</g>'
            & '</svg>';
          )
    menu: >
      (
        [
          {
            "link": "/entities/components/tree",
            "location": entities.components.config.root_menu
          }
        ]
      )